#import <Foundation/Foundation.h>
#import "PersistentDataType.h"
#import "GPSLocation.h"
#import "Location.h"
#import "SFUConstants.h"

/**
 * A PointOfInterest is an object representing a single point of 
 * interest.
 *
 * Conforms to the PersistentDataType protocol.
 *
 * @author      Justin Hollander
 * @version     1.4.1
 * @since       0.1.0
 * @see         PersistentDataType
 */
@interface PointOfInterest : Location<PersistentDataType> {
	PointOfInterestCategory category;     // The category of the point of interest
	NSMutableArray*         poiTags;      // List of alternate point of interest names
	BOOL                    isSelected;   // Whether it is selected
	
}

@property PointOfInterestCategory category;
@property (nonatomic, retain) NSMutableArray* poiTags;
@property (nonatomic, retain) NSString* desc;
@property BOOL isSelected;


/**
 * Initialize the point of interest with given information.
 *
 * @param nm             the name of the point of interest
 * @param location       location of the point of interest
 * @param cat            the category of the point of interest
 * @param selectedState  whether the point of interest is selected
 * @return               the initialized point of interest with details
 */
- (id)initWithDetails:(NSString*)nm 
				point:(GPSLocation*)location 
			 category:(PointOfInterestCategory)cat 
			 selected:(BOOL)selectedState;

/**
 * Initialize the point of interest with given information.
 *
 * @param nm             the name of the point of interest
 * @param location       location of the point of interest
 * @param cat            the category of the point of interest
 * @param tags           the list of tags associated with the point of interest
 * @param selectedState  whether the point of interest is selected
 * @return               the initialized point of interest with details
 */
- (id)initWithDetails:(NSString*)nm 
				point:(GPSLocation*)location 
			 category:(PointOfInterestCategory)cat 
			  tagList:(NSArray*)tags
			 selected:(BOOL)selectedState;

/**
 * Initialize the point of interest with given information.
 *
 * @param nm             the name of the point of interest
 * @param description    the description of the point of interest
 * @param location       location of the point of interest
 * @param cat            the category of the point of interest
 * @param tags           the list of tags associated with the point of interest
 * @param selectedState  whether the point of interest is selected
 * @return               the initialized point of interest with details
 */
- (id)initWithDetails:(NSString*)nm 
		  description:(NSString*)description
				point:(GPSLocation*)location 
			 category:(PointOfInterestCategory)cat 
			  tagList:(NSArray*)tags
			 selected:(BOOL)selectedState;

/**
 * Initialize the point of interest given another one.
 *
 * @param poi  the other point of interest with which to initialize
 * @return     the initialized point of interest 
 */
- (id)initWithPOI:(PointOfInterest*)poi;

@end
